package com.hunttown.mes.common.utils;

import bsh.EvalError;
import bsh.Interpreter;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @title: beanshell
 * @author: wangjunfu
 * @date: 2021年04月20日 9:57
 * @description:
 */
public class BeanShellUtils {

    /**
     * 计算表达式的值
     *
     * @param expression 表达式
     * @return TF
     */
    public static boolean evalBool(String expression) {
        Object result = eval(expression);
        if (result == null) {
            return false;
        }

        return result.toString().equals("true");
    }

    /**
     * 计算表达式的值
     *
     * @param expression 表达式
     * @return 整型
     */
    public static Integer evalInt(String expression) {
        Object result = eval(expression);
        if (result == null) {
            return 0;
        }

        return Integer.parseInt(result.toString());
    }

    /**
     * 计算表达式的值
     *
     * @param expression 表达式
     * @param scale      保留小数位数
     * @return Bigdecimal
     */
    public static BigDecimal evalBigdecimal(String expression, Integer scale) {
        Object result = eval(expression);
        if (result == null) {
            return BigDecimal.ZERO;
        }

        BigDecimal big = new BigDecimal(result.toString());
        return big.setScale(scale, RoundingMode.HALF_UP);
    }

    //公用
    private static Object eval(String expression) {
        try {
            Interpreter interpreter = new Interpreter();
            return interpreter.eval(expression);

        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

    public static void main(String[] arr) {
        System.out.println("运算结果1：" + evalBool("1.5>1"));
        System.out.println("运算结果2：" + evalInt("53+2*3"));
        System.out.println("运算结果3：" + evalBigdecimal("5+2*3", 0));
    }
}
